package com.zf.canal.handler;

import org.springframework.core.ResolvableType;
import org.springframework.util.ClassUtils;

/**
 * 处理数据
 * @author Zhou Feng
 */
public abstract class RowDataHandler<T> {
    /**
     * 处理插入数据
     */
    abstract public void insert(T rowData);

    /**
     * 处理更新数据
     * @param before 更新前的数据
     * @param after 更新后的数据
     */
    abstract public void update(T before, T after);

    /**
     * 处理插入数据
     */
    abstract public void delete(T rowData);

    /**
     * 获取 RowDataHandler 子类中 T 的具体类型
     */
    public Class<T> getEntityClass() {
        return (Class<T>) this.getResolvableType().as(RowDataHandler.class).getGeneric(0).getType();
    }

    /**
     * @see ResolvableType
     */
    private ResolvableType getResolvableType() {
        return ResolvableType.forClass(ClassUtils.getUserClass(getClass()));
    }
}
